package Code.Day6_20240923.com.dx.day06;


import lombok.Getter;

import java.util.Arrays;
import java.util.List;

/**
 * @ClassName Test01
 * @Description 多态测试
 * @Author 12994
 * @Date 2024/9/23 10:17
 * @Version 1.0
 **/
@Getter
public class Test01 {
    //    private boolean bool;
    public static void main(String[] args) {
//        ChinesePerson xiaoming = new ChinesePerson("小明", "程序员");
//        xiaoming.play();
//        xiaoming.speak();
//        xiaoming.work();
//
//        AmericaPerson maria = new AmericaPerson("Maria", "Teacher");
//        maria.speak();
//        maria.work();


        List<People> peopleList = Arrays.asList(
                new Chinese("小明", "程序员"),
                new America("Maria", "Teacher")
        );

        for (People p : peopleList) {
            p.speak();
            p.work();
            // 强制类型转换, 从子类向上转型得到的父类, 可以向下强转成原有的那个子类.
            if (p instanceof Chinese) {
                ((Chinese) p).play();
            }
        }

        Person p = makePerson("cn");
        // 断言, p不能为null;
        // 断言失败会导致程序无条件退出, 因此仅在开发和测试中使用.
        // 并且某些情况下断言不能输出完整的错误堆栈, 因此那些时候通常使用try-catch.
        assert p != null;
        p.speak();

    }

    // 也可以在定义中return父类
    public static Person makePerson(String str) {
        if (str.equalsIgnoreCase("cn")) {
            return new Chinese("111", "222");
        } else if (str.equalsIgnoreCase("us")) {
            return new America("333", "444");
        } else return null;
    }
}
